package cn.iocoder.yudao.module.reading.dal.mysql.classes;

import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.reading.dal.dataobject.classes.ClassMemberDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 班级成员 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface ClassMemberMapper extends BaseMapperX<ClassMemberDO> {

    /**
     * 根据班级ID查询成员列表
     *
     * @param classId 班级ID
     * @return 成员列表
     */
    default List<ClassMemberDO> selectByClassId(Long classId) {
        return selectList(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getIsActive, true)
                .orderByAsc(ClassMemberDO::getJoinTime));
    }

    /**
     * 根据班级ID查询学生成员列表（排除老师）
     *
     * @param classId 班级ID
     * @return 学生成员列表
     */
    default List<ClassMemberDO> selectStudentsByClassId(Long classId) {
        return selectList(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getIsActive, true)
                .ne(ClassMemberDO::getRole, "teacher")
                .orderByAsc(ClassMemberDO::getJoinTime));
    }

    /**
     * 统计班级学生成员数量（排除老师）
     *
     * @param classId 班级ID
     * @return 学生成员数量
     */
    default Integer countStudentsByClassId(Long classId) {
        return Math.toIntExact(selectCount(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getIsActive, true)
                .ne(ClassMemberDO::getRole, "teacher")));
    }

    /**
     * 根据用户ID查询班级成员记录
     *
     * @param userId 用户ID
     * @return 班级成员列表
     */
    default List<ClassMemberDO> selectByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getUserId, userId)
                .eq(ClassMemberDO::getIsActive, true)
                .orderByDesc(ClassMemberDO::getJoinTime));
    }

    /**
     * 根据班级ID和用户ID查询成员记录
     *
     * @param classId 班级ID
     * @param userId  用户ID
     * @return 成员记录
     */
    default ClassMemberDO selectByClassIdAndUserId(Long classId, Long userId) {
        return selectOne(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getUserId, userId));
    }

    /**
     * 统计班级成员数量
     *
     * @param classId 班级ID
     * @return 成员数量
     */
    default Integer countByClassId(Long classId) {
        return Math.toIntExact(selectCount(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getIsActive, true)));
    }

    /**
     * 根据班级ID和角色查询成员列表
     *
     * @param classId 班级ID
     * @param role    角色
     * @return 成员列表
     */
    default List<ClassMemberDO> selectByClassIdAndRole(Long classId, String role) {
        return selectList(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getRole, role)
                .eq(ClassMemberDO::getIsActive, true)
                .orderByAsc(ClassMemberDO::getJoinTime));
    }

    /**
     * 删除班级成员（软删除）
     *
     * @param classId 班级ID
     * @param userId  用户ID
     * @return 影响行数
     */
    default int deleteByClassIdAndUserId(Long classId, Long userId) {
        return delete(new LambdaQueryWrapperX<ClassMemberDO>()
                .eq(ClassMemberDO::getClassId, classId)
                .eq(ClassMemberDO::getUserId, userId));
    }

}
